﻿/*
页面初始化和调用控制部分位于此文件最后
*/

/**********************************************************函数分割线**************************************/


/*
作用：生成所有生日好友列表，old_ist是全局的
名称：createBirList(arr_list)
参数：
    -arr_list：三维数组[13][32][n],每一子项都是user类型
返回：好友信息列表
*/
function createBirList(arr_list){
    //用户返回的字符串变量
    var res="";
    //把参数赋给短名称ol，作用不变
    var ol=arr_list;
    
    //暂时存放user实例
    var temp;
    //好友数目计数器，用于当索引显示
    var num=0;;
    
    //要处理的数组是三维数组，故有三层for循环，分别代表，月、日、user对象在第二层数组对象的索引
    for(var i=0;i<=12;i++){
        for(var j=0;j<=31;j++){
            //根据i（月）和j（日）来找到user对象集合数组，判断user对象的数目
            var len = ol[i][j].length;
            
            //如果存在user对象（也就是该日有过生日的好友）
            if(len>0){
                //变量这个用户列表
                for(var k=0;k<len;k++){
                    temp=ol[i][j][k];
                    //按照所需要的个数处理每一个user对象
                    res+="<p> id:" + (num++).toString() + " | " + i + "月"  + " | " + temp.uid + " | " + temp.name + " | " + temp.birthday +"</p>";                    
                }//end:k
            }
        }//end:j
    }//end:i
    return res;    
}


/**********************************************************函数分割线**************************************/


/*
名称：showusers(month,day)
作用：根据月和日弹出一个窗口来显示这天过生日的用户
参数：
    -month：月份
    -day：日期
返回值：无
*/
////////////////////////////////////////////////////////////////////////////////////////
//                                                                                    //
//          这个函数分为两部分：第一部分是函数体，第二部分是窗口定义                  //
//                                                                                    //
////////////////////////////////////////////////////////////////////////////////////////

//START： showusers -------------------------------------------------------------------------------------
//第一部分：函数体
function showusers(month,day){ 
    var html="";   
    var bir_user = friends_info_by_mon[month][day];
    var len = bir_user.length;        
    for(i=0;i<len;i++){                 
        var user = bir_user[i];            
        html+=  '<div class="dialog-eq-bir"><table width="230" border="0">'+
            '<tr><td>姓名：</td><td>'+ user.name +'</td><td rowspan="2"><a href="http://www.renren.com/profile.do?id=' +  user.uid +'" target="_blank"><img name="" src="'+user.headurl+'" width="100" height="100" alt="" /></a></td></tr>'+
            '<tr><td>出生于：</td><td>'+ user.birthday +'</td></tr>'+
            '</table></div>';            
    }
    $("#dialog-eq-bir-info").html(html);        
    $("#dialog-eq-bir-info").dialog('open');
}

//第二部分：弹出窗口定义
$(function(){
    $('#dialog-eq-bir-info').dialog({
	    autoOpen: false,
	    width: 550,
	    minHeight:350,
	    resizable:false,
	    title:"该日过生日的好友",
	    position:["center",40],
	    buttons: {
		    "返回": function() { 
			    $(this).dialog("close"); 
		    }
	    }
    }); 
});
//END： showusers -------------------------------------------------------------------------------



/**********************************************************函数分割线**************************************/




/*
名称：无
作用：点击日期格子用户头像是弹出用户详细信息的窗口，这是一个jquery绑定的自动函数，不需要手动调用
参数：无
返回值：无
*/
$(function(){
	$('#dialog-user-info').dialog({
		autoOpen: false,
		width: 300,
		height:250,
		resizable:false,
		title:"详细信息",
		position:["center",150],
		buttons: {
			"返回": function() { 
				$(this).dialog("close"); 
			}
		}
	});
	

    $(".cal-user-img").live("click",function(){   
        var len=friends_info.length;
        var uid=$(this).attr("title");
        var user;
        for(i=0;i<len;i++){
            if(uid==friends_info[i].uid){
                user=friends_info[i];
                break;
            }
        }
        var html=""
        html +='<table width="250" border="0">'+
          '<tr><td>姓名：</td><td>'+ user.name +'</td><td rowspan="2"><a href="http://www.renren.com/profile.do?id=' +  user.uid +'" target="_blank"><img name="" src="'+user.headurl+'" width="100" height="100" alt="" /></a></td></tr>'+
          '<tr><td>出生于：</td><td>'+ user.birthday +'</td></tr>'+
        '</table>';
        $("#dialog-user-info").html(html);    
        $("#dialog-user-info").dialog('open');
        return false;
    });
});


/**********************************************************函数分割线**************************************/




/*
名称：Render()
作用：日历的年份或月份改变时，重新渲染日历每个格子
参数：无
返回值：无
*/
function Render() 
{
    $(".cal-item").each(
        function(){
            //得到当前月份
            var m=parseInt($("#sel_mon").val(),10);            
            //得到空格应该显示的日期
            var d=parseInt($(this).html(),10);  //此数字可能为NaN            
            //日期满足日历时条件
            if(d>0 && d<=31){                
                var birthday_num = friends_info_by_mon[m][d].length;                
                if(birthday_num>0){
                    var user = friends_info_by_mon[m][d][0];
                    var html=""+
                        "<table>\n"+
                        "   <tr><td><a href='javascript:showusers("+ m +","+ d +")'>"+ birthday_num +"</a></td><td>" + user.name + "</td><td>"+ d +"</td></tr>\n"+
                        "   <tr><td  colspan='3'>"+ "<a href='javascript:void(0)'><img title='"+ user.uid +"' class='cal-user-img' src='" + user.headurl +"'/></a>" +"</td></tr>\n"+
                        "</table>\n";
                    $(this).html(html);
                } 
            }        
        }
    );
    $("#showing-month").html($("#sel_mon").val()+"月");
}





/**********************************************************函数分割线**************************************/



/*
名称：无
作用：本日历在这个版本（2010-2-28）时有两部分日历控制器，
        一部分为年份和月份下拉菜单控制，
        另一部分是顶部较大的链接控制，
        点击这个链接后通过此函数修改年份下拉菜单的值，
        并通过月份下拉菜单绑定的事件修改日历Body部分。
参数：无
返回值：无
*/
$(function(){
    $(".cal-tip a").live("click",function(){
        var v= $("#sel_mon").val($(this).text());
        FlushCal();
    });
});




/**********************************************************函数分割线**************************************/


/*
此部分包含全局变量定义以及页面初始化信息，页面系统从这里开始
*/
////////////////////////////////////////////////////////////////////////////////////////
//                                                                                    //
//                                       运行开始                                     //
//                                                                                    //
////////////////////////////////////////////////////////////////////////////////////////




//user对象数组，存放所有用户信息，便于松散查询
var friends_info;

/*
三维数组，按照月集合->日集合->user集合，来树形存放user对象
这三维分别代表月、日、用户
第一维：月数组，    其中每一个对象是一个日数组。 长度是13（人人网日期用00表示用户没有定义自己的生日，或对生日保密，所以用索引0表示“0”月）
第二维：日数组，    其中每一个对象是一个用户数组。长度为32，原因同上
第三维：user数组，  每个数组元素表示一个user对象的叶子节点，数组长度大于0
*/
var friends_info_by_mon = new Array(13);

//初始化 friends_info_by_mon 这个三维数组
for(i=0;i<13;i++){
    friends_info_by_mon[i]=new Array(32);    
    for(j=0;j<32;j++){
        //把每一个二维数组再定义成一个数组对象（存放user类实例）
        friends_info_by_mon[i][j]=new Array();
    }  
}  



/*
jquery方式绑定的匿名函数，页面加载完成自动执行
*/
$(function(){
    //把日历绑定到id为cal的DOM对象上
    createFullCal($("#cal"));
    
    /*
       作用：
            请求user对象的文本形数据，
            然后用json方式赋给全局变量friends_info（用户对象集合）和全局变量friends_info_by_mon（三维数组），
            请求地址的 window.location.search 是来源页面的查询部分（加入页面是从 “http://baidu.com/a.asp?id=50&class=swim”  链入的 ），
            因为我们的程序显示在renren网应用的框架里，所以这个地址包含了请求数据必须的api_key等必须的验证参数。
            如果请求数据正确返回的数据类似：“ ({"res":[{"key1":"value1",{"key2":"value2"},{"key1":"value1",{"key2":"value2"}} ”
    */
    $.getJSON("ajax.php"+window.location.search,
        //请求完成的回调函数，data为json格式的文本
        function (friends_info) {
                                 
            //得到包含user对象的数目
            var len = friends_info.length;
            /*
                下面直到for循环结束都是在初始化全局的三维数组：friends_info_by_mon
            */
            
            //START： 初始化 friends_info_by_mon ----------------------------------------------------- 
            
            //用户暂时存放key的值
            var temp_mon=0;
            for(var i=0;i<len;i++){                
                /*
                    注意parseInt函数的进制需要指明为10，默认为8进制方式转换，
                    如：parseInt("数字形式字符串",[进制])
                */
				try {                
					//得到当前user的生日所在的月份
					var temp_mon = parseInt(friends_info[i].birthday.substr(5,2),10);
					//得到当前user的生日所在的在日期
					var temp_day = parseInt(friends_info[i].birthday.substr(8,2),10);
					
					/*
						发现某些用户通过不明方式把生日的月份或日期改的超出实际范围，
						下面两条语句用于过滤这些不合法月份和日期，
						并把不合法生日的用户生日归入到“0000-00-00”这个user集合，也就是把这个用户信息放到 生日为0月0日的user数组集合里
					*/
					temp_mon = (temp_mon>12 || temp_mon < 0)?  0 : temp_mon;//防止有人把生日通过恶意手段修改超出范围
					temp_day = (temp_day>31 || temp_day < 0)?  0 : temp_day;//防止有人把生日通过恶意手段修改超出范围					
					
					//把用户信息填充到三维数组里，可以按照这个方式使用 friends_info_by_mon[月份][日期][索引]，得到user对象                
					friends_info_by_mon[temp_mon][temp_day].push(friends_info[i]);
				} catch (err) {
				}
            } 
            //END： 初始化 friends_info_by_mon-----------------------------------------------------      
            
            //渲染日历Body部分，   必须放到这里，异步方式请求数据会在数据的非同步性可能导致在首次在外部调用时访问不到数据
            Render() ;              
        });      
});